package Extractor;

import java.util.HashMap;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class Engine {

	
	public String started( 
						String html, 							
						String xml			
						) throws Exception{
		
		String result="";
		
		try{
			
			String xmlresult	=	this.readXMLFile(html, xml);
			
			//ReadWriteTextFile filerw = new ReadWriteTextFile();
			
			//filerw.write( fileresponse, xmlresult);
			result = xmlresult;    
			    
			
		}catch( Exception e){
			
			 throw new Exception(e.getMessage());
		}
		
		return result;
	
	}
	
	
	private String readXMLFile(String html, String xml) throws Exception{
	
		
		String result="";
		
		try{
			
			 Document documentXML = Jsoup.parse(xml);
			    Document documentXHTML = Jsoup.parse(html);
			    
			    
			    
			    
			    
			    //Document xmlDoc = Jsoup.parse(xml, "", Parser.xmlParser());
			    //Elements links = xmlDoc.select("link");
			    //System.out.println("Link text 1: " + links.get(0).text());
			    //System.out.println("Link text 2: " + links.get(1).text());
			    
			    
			    HashMap<Element,String> valoresCampos = new HashMap<Element, String>();
			    Elements camposProcurados = documentXML.getElementsByTag("campo");
			    
			    result	=	"<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\n";			    
			    //System.out.println("<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>");
			    
			    result	=	result+"<campos>\n";
			    //System.out.println("<campos>");
			    
			    for (Element campoProcurado : camposProcurados)
			    {
			        //SE TIVER ID
			        Elements idsProcurados =campoProcurado.getElementsByTag("id");
			        if (idsProcurados!=null && idsProcurados.first()!=null)
		            {
			        	result	=	result+"<"+campoProcurado.getElementsByTag("nomeCampoXML").text()+">"+readDataByID(documentXHTML, idsProcurados.first().text().trim())+"</"+campoProcurado.getElementsByTag("nomeCampoXML").text()+">\n";
			        	//System.out.println("<"+campoProcurado.getElementsByTag("nomeCampoXML").text()+">"+readDataByID(documentXHTML, idsProcurados.first().text().trim())+"</"+campoProcurado.getElementsByTag("nomeCampoXML").text()+">");
			        }
			        //SE TIVER CLASS
			        Elements classesProcuradas = campoProcurado.getElementsByTag("class");
			        Elements classesExcluidas = campoProcurado.getElementsByTag("noClass");
			        Elements classesProcuradasComOr = campoProcurado.getElementsByTag("classOr");
			        if (classesProcuradas!=null && classesProcuradas.first()!=null)
		            {
			            if (classesExcluidas!=null && classesExcluidas.first()!=null)
			            {
			                Elements camposDaClasseEncontrados= readDataByClassExcludeClass(documentXHTML, classesProcuradas.first().text().trim(), classesExcluidas.first().text().trim());
		                    for(Element campoDaClasseEncontrado : camposDaClasseEncontrados)
		                    {
		                    	
		                    	result	=	result+"<"+campoProcurado.getElementsByTag("nomeCampoXML").text()+"><![CDATA["+campoDaClasseEncontrado.text().trim()+"]]></"+campoProcurado.getElementsByTag("nomeCampoXML").text()+">\n";
		                    	//System.out.println("<"+campoProcurado.getElementsByTag("nomeCampoXML").text()+"><![CDATA["+campoDaClasseEncontrado.text().trim()+"]]></"+campoProcurado.getElementsByTag("nomeCampoXML").text()+">");
		                        valoresCampos.put(campoProcurado, campoDaClasseEncontrado.text());
		                    }
			            }
			            else
			            {
		                    Elements camposDaClasseEncontrados= readDataByClass(documentXHTML, classesProcuradas.first().text().trim());
		                    for(Element campoDaClasseEncontrado : camposDaClasseEncontrados)
		                    {
		                    	result	=	result+"<"+campoProcurado.getElementsByTag("nomeCampoXML").text()+"><![CDATA["+campoDaClasseEncontrado.text().trim()+"]]></"+campoProcurado.getElementsByTag("nomeCampoXML").text()+">\n";
		                    	//System.out.println("<"+campoProcurado.getElementsByTag("nomeCampoXML").text()+"><![CDATA["+campoDaClasseEncontrado.text().trim()+"]]></"+campoProcurado.getElementsByTag("nomeCampoXML").text()+">");
		                        valoresCampos.put(campoProcurado, campoDaClasseEncontrado.text());
		                    }
			            }
		            }
			        if (classesProcuradasComOr!=null && classesProcuradasComOr.first()!=null)
		            {
		                Elements camposDaClasseEncontrados= readDataByClassOu(documentXHTML, classesProcuradasComOr.first().text().trim());
		                for(Element campoDaClasseEncontrado : camposDaClasseEncontrados)
		                {
		                	result	=	result+"<"+campoProcurado.getElementsByTag("nomeCampoXML").text()+"><![CDATA["+campoDaClasseEncontrado.text().trim()+"]]></"+campoProcurado.getElementsByTag("nomeCampoXML").text()+">\n";
		                	//System.out.println("<"+campoProcurado.getElementsByTag("nomeCampoXML").text()+"><![CDATA["+campoDaClasseEncontrado.text().trim()+"]]></"+campoProcurado.getElementsByTag("nomeCampoXML").text()+">");
		                    valoresCampos.put(campoProcurado, campoDaClasseEncontrado.text());
		                }
		            }
			    }
			    
			    result	=	result+"</campos>\n";
			    //System.out.println("</campos>");
			    
			    
		}catch( Exception e){
			
			 throw new Exception(e.getMessage());
		}
		  
		
		return result;
	    
	}
	
	private String readDataByID(Document xmlDocument, String id)
	{
	    return xmlDocument.getElementById(id).text().trim();
	}
	
	
	private Elements readDataByClass(Document xmlDocument, String classe)
    {
	    Elements resultado=null;
	    String classes[]=classe.split(" ");
	    
	    for(String classeAtual : classes)
	    {
	        if (resultado==null)
	            resultado=xmlDocument.select("."+classeAtual);
	        else
	            resultado=resultado.select("."+classeAtual);
	    }
	    return resultado;
    }
	
	
	private Elements readDataByClassExcludeClass(Document xmlDocument, String classeProcurada , String classeExcluida)
    {
        Elements resultado=null;
        String classes[]=classeProcurada.split(" ");
        
        for(String classeAtual : classes)
        {
            if (resultado==null)
                resultado=xmlDocument.select("."+classeAtual);
            else
                resultado=resultado.select("."+classeAtual);
            
        }
        return resultado.not("."+classeExcluida);
    }
	
	
	private Elements readDataByClassOu(Document xmlDocument, String classesProcuradas)
    {
        Elements resultado=null;
        String classes[]=classesProcuradas.split(" ");
        
        for(String classeAtual : classes)
        {
            if (resultado==null)
                resultado=xmlDocument.select("."+classeAtual);
            else
                resultado.addAll(xmlDocument.select("."+classeAtual));
        }
        resultado.removeAll(readDataByClass(xmlDocument, classesProcuradas));
        resultado.addAll(readDataByClass(xmlDocument, classesProcuradas));
        return resultado;
    }
	
	
//	private String searchToken( String Token ) throws Exception{
//		
//		String content="";
//		
//		return content;
//		
//	}
	
}
